#ifndef __HAL_RS485__
#define __HAL_RS485__

#include "hal_config.h"
#include "hal_uart.h"
 
typedef union {
#define RS485_HEAD          0XA5    // 固定头
#define RS485_TAIL          0XFB    // 固定尾
#define RS485_DATA_LEN      128     // 数据长度
#define RS485_FIXED_LEN     7       // 固定长度 
#define RS485_OPCODE_READ   0X01    // 主机读指令/需要应答
#define RS485_OPCODE_WRITE  0X02    // 主机写指令/需要应答
#define RS485_OPCODE_NOTIF  0X04    // 主机通知指令/不需要应答
#define RS485_OPCODE_HB     0X08    // 主机心跳包指令/不需要应答
    struct {
        uint8_t head;       /* 帧头 */
        uint8_t type;       /* 设备标识/设备类型 */
        uint8_t cmd;        /* 帧命令 */
        uint8_t data[2];    /* 帧数据 */
        uint8_t sum;        /* 帧校验位 */
        uint8_t tail;       /* 帧尾 */
    };
    uint8_t frame[7];  /* 包头 | 设备标识 | 命令类别 | 控制命令  | 校验和 | 结束位 */
} rs485_format_t;

/* 以下是宝恩协议相关的宏定义 */
#define DEV_TYPE_BLE    0X01    // 蓝牙
#define DEV_TYPE_HAND   0X02    // 手控器
#define DEV_TYPE_BOX    0X03    // 控制盒
#define DEV_TYPE_WIFI   0X04    // WIFI
#define DEV_TYPE_VOICE  0XFA    // 语音模块

 
void hal_rs485_init(uart_recv_callback_t cb_func);

void hal_rs485_write(const uint8_t *data, uint8_t len);

uint8_t rs485_check_sum(uint8_t *data, uint8_t len);

#endif /* __APP_RS485__ END. */

